{ "nbformat": 4, "nbformat_minor": 2, "metadata": { "colab": { "name": "37797 HW1 Q6", "provenance": [], "collapsed_sections": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "markdown", "source": [ "# Stochastic Block Model \n", "We will explore the relation between mis-clustering rate\n", "between the probability gap $\\epsilon$." ], "metadata": { "id": "9AAQGTpthJHJ" } }, { "cell_type": "code", "execution_count": 2, "source": [ "import numpy as np\n", "def generate_random_symmetric_matrix(N):\n", " # generate_random_symmetric_matrix from uniform distribution\n", " a = np.random.uniform(0,1,(N,N))\n", " m = np.tril(a) + np.tril(a, -1).T\n", " return m\n", "\n", "generate_random_symmetric_matrix(5)" ], "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([[0.04073901, 0.91398904, 0.40394606, 0.96744071, 0.11529638],\n", " [0.91398904, 0.69687795, 0.35428992, 0.73550064, 0.2678634 ],\n", " [0.40394606, 0.35428992, 0.77961952, 0.7724379 , 0.06110118],\n", " [0.96744071, 0.73550064, 0.7724379 , 0.84553956, 0.5528254 ],\n", " [0.11529638, 0.2678634 , 0.06110118, 0.5528254 , 0.09993677]])" ] }, "metadata": {}, "execution_count": 2 } ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "FgImGzdNua1T", "outputId": "77b16383-61a7-4aff-e0d0-f787893ea0f9" } }, { "cell_type": "code", "execution_count": 4, "source": [ "def generate_random_adjacency_matrix(n, p):\n", " # generate_random_adjacency_matrix with probability p if \n", " # (i,j) from the same commnity\n", " B = generate_random_symmetric_matrix(n) # n is assumed to be even\n", " for i in range(n):\n", " for j in range(n):\n", " if i <= n/2 and j <= n/2:\n", " if B[i,j] >= p: B[i,j] = 0\n", " else: B[i,j] = 1\n", " elif i <= n/2 and j > n/2:\n", " if B[i,j] >= (1-p): B[i,j] = 0\n", " else: B[i,j] = 1\n", " elif i >= n/2 and j <= n/2:\n", " if B[i,j] >= (1-p): B[i,j] = 0\n", " else: B[i,j] = 1\n", " else:\n", " if B[i,j] >= p: B[i,j] = 0\n", " else: B[i,j] = 1\n", " return B\n", "\n", "# Now we draw the adjacency matrix\n", "import matplotlib.pyplot as plt\n", "# change the sign of B to use black to denote there is an edge. \n", "plt.imshow(-generate_random_adjacency_matrix(20, 0.8), origin=\"upper\", cmap=\"gray\")" ], "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": {}, "execution_count": 4 }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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" }, "metadata": { "needs_background": "light" } } ], "metadata": { "id": "g0SN22qhJPgZ", "colab": { "base_uri": "https://localhost:8080/", "height": 283 }, "outputId": "bc769312-a86f-4a3e-dcbb-7ed524fc738c" } }, { "cell_type": "code", "execution_count": 9, "source": [ "from numpy import linalg as LA\n", "def SBM_model(num_nodes, eps):\n", " '''\n", " SBM model\n", " input: \n", " num_nodes: the number of nodes or number of people needed to be clustered\n", " eps: epilson or probability gap\n", " output:\n", " miss clustering rate\n", " '''\n", "\n", " p = (1+eps)/2\n", " q = (1-eps)/2\n", "\n", " # compute surrogate matrix\n", " A = generate_random_adjacency_matrix(num_nodes,p)\n", " M = A - (p+q)/2 * np.ones((num_nodes,num_nodes))\n", " w, v = LA.eig(M) # eigen-decomposition\n", "\n", " # find leading eigenvector and predict\n", " max_ind = np.argmax(w)\n", " u = v[:,max_ind] # leading eigenvector\n", " mask = u > 0 # find boolean mask\n", " cluster = 2*mask -1 # make rounding output with +1 -1\n", "\n", " # generate truth membership with +1 the first half \n", " # and -1 the second half\n", " truth_membership = np.concatenate((np.ones(int(num_nodes/2)), \n", " -1*np.ones(int(num_nodes/2))))\n", " # calculate miss clustering rate\n", " mis_cluster_rate = min(np.sum(truth_membership != cluster), \n", " np.sum(truth_membership != (-1*cluster)))/num_nodes\n", " return mis_cluster_rate\n", "\n", "SBM_model(50, 0.2)" ], "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "0.08" ] }, "metadata": {}, "execution_count": 9 } ], "metadata": { "id": "gywZhex5u1iD", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "f542dc10-b151-46aa-a49b-fe65e053359f" } }, { "cell_type": "code", "execution_count": 14, "source": [ "eps_list = np.linspace(0, 0.5, 50)\n", "error_rate_avg_record = []\n", "for e in eps_list:\n", " error_rate_list = []\n", " for i in range(200):\n", " error_rate_list.append(SBM_model(100, e))\n", " avg = np.average(error_rate_list)\n", " error_rate_avg_record.append(avg)" ], "outputs": [], "metadata": { "id": "T2-iw4deSAyP" } }, { "cell_type": "code", "execution_count": 19, "source": [ "plt.plot(eps_list, error_rate_avg_record)\n", "plt.xlabel(\"epsilon\")\n", "plt.ylabel(\"Error Rate\")\n", "plt.title(\"Mis-clustering Error Rate vs. epsilon\")\n", "plt.show()" ], "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEWCAYAAABrDZDcAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3dZ3gc5dn28f+1kmXZltzlLjdsDO7CxgFCKDEBTDEk9ECABOKEwEMS0iDJSwI8pBACKUBCSUJNgJAnxHQw2JRQZcAG44J7Actykbutdr0fZgSLUFnZ2h3t7vk7jj20Mzs7c83uas+d+55i7o6IiGSvWNQFiIhItBQEIiJZTkEgIpLlFAQiIllOQSAikuUUBCIiWU5BkCHM7M9m9v9aeZ5uZsNac557WMePzeyOqOuQaJnZPDM7Irz/czO7N+KSMoaCoI0zs+VmVmlmPeuNfyv8oh4M4O7fdPdroqixKWZ2p5n9797Mw91/4e4XtlZN8cLXcLuZbYu7/TAZy2qihuVmtjNc9trwNStI8Lnnm9lLya6xLXD3Ue4+K+o6MpGCID0sA86qGzCzMUDH6MpJHTPLTcFixrl7QdztukRqsUDC/0PNTH+iuxcA44ES4IpE5yuytxQE6eEe4Ny44fOAu+MniP/lbWY9zexRM6sws41m9mJjX0BmlhM2vSwxs61mNtvMihuYbpaZXRg3/NEv0fAL7kYzW2dmW8zsHTMbbWbTgLOBH4a/dh8Jp+9nZv8ys3IzW2Zml8bN9+dm9pCZ3WtmW4Dz45sBzGxw+Cv+PDNbaWbrzewncc/vYGZ3mdkmM5tvZj80s9UtfcGbqGWWmV1rZv8FdgBDzewQM3vDzDaHfw+p97p9Yvqmlunua4GnCAKhbh6Xx70/75nZF8Px+wN/Bg4OX9+KcHx7M7s+fH3KwmbDDg2sX/vwMzI6blxRuHXSqyWfowbmfYKZvR0+92UzGxv32HIzuyJcl01m9jczyw8fa3SZ4fOOamR5Uy1oOqoIX/P96y3v+2Y2N3yPHqhbngQUBOnhVaCzme1vZjnAmUBT7aPfA1YDRUBv4MdAY+cSuYxga+M4oDPwNYIvrJY4GjgM2BfoApwObHD324D7gOvCX9onhv/UjwBzgP7AZOA7ZnZM3PxOAh4CuobPb8ihwIjw+VfG/eP/DBhM8IX7BeCcFq5LfQ3V8hVgGlAIbAUeA/4A9ABuAB4zsx5x84iffkVTCzOzAcAUYHHc6CXA5whe26uAe82sr7vPB74JvBK+vl3D6X9F8F6MB4YRvM5X1l+Wu+8G/o+4rU2C9+55d19Hyz5H8etQAvwV+AbBa3IrMN3M2sdNdjZwDLBPWOtPw/EtXqaZ7Qv8A/hO+LzHgUfMLK/eeh0LDAHGAuc3tx7ZREGQPuq2Cr4AzAfWNDFtFdAXGOTuVe7+ojd+UqkLgZ+6+0IPzHH3DS2srYrgS24/wNx9vrt/2Mi0BwJF7n61u1e6+1LgdoJwq/OKuz/s7rXuvrOR+Vzl7jvdfQ5BqIwLx58O/MLdN7n7aoIv6Oa8Gf6SrLvFh1JDtdzp7vPcvZogBN9393vcvdrd/wEsAE6Mm8dH07t7VSM1PGxmW4FVwDqCQAPA3f/p7h+ENTwAvA9MamgmZmYEofNdd9/o7luBX/DJ1zfe3+s99uVwHLTscxRvGnCru7/m7jXufhewGzgobpqb3H2Vu28EruXjMNqTZZ4BPObuz4Sv7/VAB+CQuGn+EL6GGwl+iIxvYD5ZS0GQPu4h+Cc9n3rNQg34DcEvyqfNbKmZXQ5gZmfbxx2iT4TTFhP84txj7v4ccBNwM7DOzG4zs86NTD4I6Bf/xUvwq6933DSrEljs2rj7O4C6ztV+9Z6fyLwOcPeucbenmnl+/Lh+fPpX/gqCX+EtqeFkdy8EjiAI1I92DjCzc+OaWSqA0fGP11NE0H80O276J8PxDZkJdDSzz1iw48F44N/hYw1+jhIwCPhevfe4mOC1qhP/mqyIe2xPlvmJ98Dda8P5x78HjX1eBAVB2nD3FQSdxscRbM43Ne1Wd/+euw8FpgKXmdlkd78vrkN0Sjj5KoLN8+Zs55Md1H3qLfMP7j4BGEmwqf+DuofqzWcVsKzeF2+hux8XP7sE6mnMh8CAuOFP9Xe0UEO1xI/7gOCLL95APrnFlvD6uPvzwJ0Ev2oxs0EEW0yXAD3C5p93AWtk3uuBncCouNe3S9gR3dDyaoAHCX6RnwU8Gm5FNPo5SmA1VgHX1nuPO4ZbS3Xi35eBBK/jni7zE+9BuFVUTNNbzRJHQZBeLgA+7+7bm5oo7KgbFv5DbAZqgNpGJr8DuMbMhltgbL327TpvA18ys44WHFtwQdzyDgx/UbYjCIxdccsr45MdpK8DW83sRxZ07OZY0LF8YPOrn5AHgSvMrJuZ9Sf4Ak2mx4F9zezLZpZrZmcQhOGjezHP3wFfMLNxQCeCL/tyADP7KsEWQZ0yYEBde3j4a/h24EYz6xU+p3+95q76/k7QvHI2HzcLtfRzFO924JvhZ8LMrJOZHW9mhXHTXGxmA8ysO/AT4IG9WOaDwPFmNjn8DH6PoCnq5QRqFRQEacXdl7h7aQKTDgdmANuAV4Bb3H1mI9PeQPCP9DSwBfgLQftqfTcClQRfPHfxyU7czgT//JsINtE3EGziE85vZNhE8HD4C/QEgiaIZQS/YO8g6AhtDVcTdDYuI3gNHiL4UmjKHPvkcQS/S3RhYX/KCQRfPhuAHwInuPv6Pao+mGc5QfPfle7+HvBbgvexDBgD/Ddu8ueAecBaM6tb5o8ImldetWBvpxkEHeuNLe81ggDvBzwR91CjnyMze8LMftzI/EqBrxM0F24Kazm/3mR/J/jMLSVomqw71qQln9265S0k2CngjwSfpxMJdsetbOp58jFLrO9HJD2Z2UXAme5+eNS1SMDMlgMXuvuMqGuRgLYIJKOYWV8z+6yZxcxsBMEv9X839zyRbJaKozZFUimPYL/1IUAFcD9wS6QVibRxahoSEclyahoSEclyadc01LNnTx88eHDUZYiIpJXZs2evd/cGDyxMuyAYPHgwpaWJ7EEpIiJ1zKzR81ypaUhEJMspCEREspyCQEQkyykIRESynIJARCTLKQhERLKcgkBEJMtlTRDMWVXBTc+9z/L1TZ7KX0Qk66TdAWV76tWlG7j+6UVc//QixvTvwglj+3L82L4M6Nax+SeLiGSwtDvp3MSJE31Pjyz+oGInj839kEfmfsDc1ZsBOGBgV6aM7kuvzu3p0C6HDnk5dGiXQ367HDrm5TCoRydyYtbMnEVE2jYzm+3uExt8LJuCIN6KDdt5dO6HPDLnAxas3drodD0L8jh2dB+OH9OPSUO6KxREJC0pCJqxbssutuyqZldVDbuqathZVcPOyho276xi1qJynpu/jp1VNfQsaM+U0X04bkxfhYKIpBUFwV7aUVnNrIXlPDb3Q55dUMauqlq6dWzH4fsWceR+vThseBHdOuWltCYRkZZQELSiHZXVzFxQzrPzy5i1qJyN2yuJGYwv7sqRI3oxZUxfhvUqiKw+EZGGKAiSpLbWmbtmMzMXrGPWonLmrq4gx4xvTx7ORUfsQ25O1uydKyJtnIIgRdZt3cW1j83nP29/QMnArtxw+niG9OwUdVkiIk0GgX6ytqJehfn8/swS/nBWCUvWbeO437/Ifa+tIN3CVkSyi4IgCaaO68dT3z2MiYO78ZN/v8vX7nyDdVt3RV2WiEiDFARJ0rdLB+766iR+fuJIXl6ygSm/e5HF67ZFXZaIyKcoCJIoFjPO/+wQHv2fQzGDr935Bhu27Y66LBGRT1AQpMDw3oXcfu5Eyrbs4ut3l7KrqibqkkREPqIgSJGSgd343RnjeXNlBd//5xxqa9WBLCJtg4IghaaM6csVU/bj0bkf8ttnFkZdjogIkEWnoW4rph02lOUbdnDzzCUM6t6J0w8sjrokEclyCoIUMzOuPmkUqzft4Mf/fod+XTtw6PCeUZclIllMTUMRaJcT45azD2BYrwIuunc2i8oaPw22iEiyKQgiUpjfjr+cfyD5eTl89W864ExEoqMgiFD/rh342/kHsmlHJRfcWcqOyuqoSxKRLKQgiNjo/l3441klzPtgM5f+4y1qtFupiKSYgqANmLx/b66aOooZ89dx9SPzdJI6EUkp7TXURnzl4MGs3LiD219cRnH3jlz4uaFRlyQiWUJB0IZcMWV/Vm/aybWPz2dAtw4cO7pv1CWJSBZIatOQmR1rZgvNbLGZXd7EdKeYmZtZgxdNyBaxmHHjGeMZX9yVb9//NnNWVURdkohkgaQFgZnlADcDU4CRwFlmNrKB6QqBbwOvJauWdJLfLoc7zp1Iz4L2fP+fc6iqqY26JBHJcMncIpgELHb3pe5eCdwPnNTAdNcAvwa0I32oR0F7rpo6ivfXbeMvLy2LuhwRyXDJDIL+wKq44dXhuI+Y2QFAsbs/1tSMzGyamZWaWWl5eXnrV9oGHTWyN18Y2Zvfz3ifNRU7oy5HRDJYZLuPmlkMuAH4XnPTuvtt7j7R3ScWFRUlv7g24mcnBi1pV02fF3ElIpLJkhkEa4D4U2sOCMfVKQRGA7PMbDlwEDA92zuM4w3o1pFLJw/n6ffKeHZ+WdTliEiGSmYQvAEMN7MhZpYHnAlMr3vQ3Te7e093H+zug4FXganuXprEmtLOBYcOYXivAn42fR47K3VlMxFpfUkLAnevBi4BngLmAw+6+zwzu9rMpiZruZkmLzfGNSePZvWmndw8c3HU5YhIBkrqAWXu/jjweL1xVzYy7RHJrCWdHTS0B18q6c+tLyzh5JL+DOtVEHVJIpJBdK6hNHHFcfvToV0OV/7nXZ2LSERalYIgTRQVtucHx+7Hy0s2MH3OB1GXIyIZREGQRr48aSDjirty1SPv6UI2ItJqFARpJCdm/Pa0sWzfXc3l/3pHTUQi0ioUBGlmWK9CLp+yH88tWMf9b6xq/gkiIs1QEKSh8w4ezKHDenLNo++xfP32qMsRkTSnIEhDsZjxm9PGkhszLnvwbap1hlIR2QsKgjTVt0sHrjl5NG+urODWF5ZGXY6IpDEFQRo7aXx/ThzXjxufWcS7azZHXY6IpCkFQZq75qRR9CjI47sPvM2uKp2LSERaTkGQ5rp2zOP608bx/rptXPfkwqjLEZE0pCDIAJ8bXsQ5Bw3kzpeXaS8iEWkxBUGGuHTycHJzYuo4FpEWUxBkiF6F+Zw2YQD/mr2asi06/YSIJE5BkEG+cdg+VNfW6oL3ItIiCoIMMrBHR04c14/7Xl3B5h1VUZcjImlCQZBhLjpiH7ZX1nDXK8ujLkVE0oSCIMPs16czk/frxd/+u4wdldVRlyMiaUBBkIG+deQ+bNpRxf2v6+ykItI8BUEGmjCoO5OGdOf2F5dSWa0T0olI0xQEGepbR+zDh5t38fDba6IuRUTaOAVBhjp83yJG9evMn59fQk2trmQmIo1TEGQoM+OiI/Zhafl2np63NupyRKQNUxBksCmj+zKkZydumbVE1zcWkUYpCDJYTsyYdthQ3lmzmbdXVURdjoi0UQqCDHfcmL60yzGefFfNQyLSMAVBhuvSoR2H7NOTJ+etVfOQiDRIQZAFpozuw4oNO5j/4daoSxGRNkhBkAWOGtmbmMGT2ntIRBqgIMgCPQvac+Dg7jylfgIRaYCCIEtMGd2HhWVbWVq+LepSRKSNURBkiaNH9QHUPCQin6YgyBL9unZgXHFX7UYqIp+iIMgiU0b3Ye7qzayp2Bl1KSLShigIssgxYfOQOo1FJF5Sg8DMjjWzhWa22Mwub+Dxb5rZO2b2tpm9ZGYjk1lPthvSsxP79SlU85CIfELSgsDMcoCbgSnASOCsBr7o/+7uY9x9PHAdcEOy6pHAMaP68MaKjZRv3R11KSLSRiRzi2ASsNjdl7p7JXA/cFL8BO6+JW6wE6BzICTZlDF9cIen39NWgYgEkhkE/YH4i+auDsd9gpldbGZLCLYILm1oRmY2zcxKzay0vLw8KcVmixG9Cxnco6Oah0TkI5F3Frv7ze6+D/Aj4KeNTHObu09094lFRUWpLTDDmBnHjO7DK0s2sHlHVdTliEgbkMwgWAMUxw0PCMc15n7g5CTWI6Epo/tSXevMmF8WdSki0gYkMwjeAIab2RAzywPOBKbHT2Bmw+MGjwfeT2I9Ehrbvwt9u+TrKGMRASA3WTN292ozuwR4CsgB/uru88zsaqDU3acDl5jZUUAVsAk4L1n1yMdiMeOYUX34x+sr2b67mk7tk/YxEJE00Ow3gJkZcDYw1N2vNrOBQB93f72557r748Dj9cZdGXf/2y0vWVrDsaP7cOfLy3ni3bWcOmFA1OWISIQSaRq6BTgYOCsc3kpwfICksUmDuzOyb2dufGYRu6pqoi5HRCKUSBB8xt0vBnYBuPsmIC+pVUnSxWLGj4/bnzUVO7n7leVRlyMiEUokCKrCo4QdwMyKgNqkViUpcejwnhwxooibnlvMpu2VUZcjIhFJJAj+APwb6GVm1wIvAb9MalWSMldM2Z9tu6v543OLoy5FRCLSbGexu99nZrOByYABJ7v7/KRXJikxok8hp08s5p5Xl3PeIYMY1KNT1CWJSIo1u0VgZve4+4LwCOCb3H2+md2TiuIkNS77wr7kxmJc9+TCqEsRkQgk0jQ0Kn4g7C+YkJxyJAq9Oucz7bChPPbOh8xesSnqckQkxRoNAjO7wsy2AmPNbIuZbQ2H1wH/SVmFkhLTDhtKUWF7fvH4fNx1EliRbNJoELj7L929EPiNu3d298Lw1sPdr0hhjZICndrnctkX9mX2ik06M6lIlmm2acjdrzCzbmY2ycwOq7ulojhJrdMmDGB4rwJ+/eQCKqu1h7BItkiks/hC4AWCcwZdFf79eXLLkijk5sT48XH7s3zDDh54Y2XU5YhIiiTSWfxt4EBghbsfCZQAFUmtSiJzxIgihvcq4NkF66IuRURSJJEg2OXuuwDMrL27LwBGJLcsiYqZMWFQN95aWaFOY5EskUgQrDazrsDDwDNm9h9gRXLLkiiVDOzK5p1VLFu/PepSRCQFEjmy+Ivh3Z+b2UygC/BEUquSSJUM7AbAWysrGFpUEHE1IpJsLbpCmbs/T3AW0sebm1bS17CiAgrb5/LWKh1cJpINmjqg7PNmtsjMtpnZvWY2xsxKCU4496fUlSipFosZ44q78tZK7RMgkg2a2iL4LTAN6AE8BLwC3OnuE9z9/1JRnESnZGBXFqzdyo7K6qhLEZEkayoI3N1nuftud38YWOPuN6WqMIlWycCu1NQ676zeHHUpIpJkTXUWdzWzL8VPGz+srYLMNr447DBeVcFnhvaIuBoRSaamguB54MS44Rfihh1QEGSw7p3yGNyjI2/qbKQiGa/RIHD3r6ayEGl7SgZ246XF63F3zCzqckQkSVq0+6hkl5KBXSnfups1FTujLkVEkkhBII0qKf74wDIRyVxNBoGZxczskFQVI23Lfn0LaZ8bUxCIZLgmg8Dda4GbU1SLtDHtcmKMHdBFRxiLZLhEmoaeNbNTTL2FWalkYDfmrdnC7uqaqEsRkSRJJAi+AfwTqIy7dvGWJNclbURJcVcqa2p57wO95SKZKpFLVRa6e8zd28Vdu7hzKoqT6MWfiVREMlOzp6EGMLOpQN11ime5+6PJK0nakj5d8unbJZ+3VikIRDJVItcs/hXB5SrfC2/fNrNfJrswaTtKBnblrZXqMBbJVIn0ERwHfMHd/+rufwWOBY5PblnSlpQUd2P1pp2s27or6lJEJAkSPaCsa9z9LskoRNqukoHB2/+2+glEMlIiQfAL4C0zu9PM7gJmA9cmtyxpS0b370JuzNRPIJKhmuwsNrMYUAscBBwYjv6Ru69NdmHSduS3y2Fkv87qJxDJUIkcWfxDd//Q3aeHt4RDwMyONbOFZrbYzC5v4PHLzOw9M5trZs+a2aA9WAdJgZLirsxdvZnqmtqoSxGRVpZI09AMM/u+mRWbWfe6W3NPMrMcgtNTTAFGAmeZ2ch6k70FTHT3sQSXw7yuhfVLipQM7MaOyhoWlW2LuhQRaWWJHEdwRvj34rhxDgxt5nmTgMXuvhTAzO4HTiLYBTWYifvMuOlfBc5JoB6JQF2H8VurNjGyn44nFMkkzZ59FLjc3YfUuzUXAgD9gVVxw6vDcY25AHiikTqmmVmpmZWWl5cnsGhpbQO7d6R7pzwdYSySgRLpI/hBsosws3OAicBvGqnjNnef6O4Ti4qKkl2ONMDMmDS4O8/OL2PLrqqoyxGRVpS0PgJgDVAcNzwgHPcJZnYU8BNgqrvvTqhqicTFRw5j044q/jxrSdSliEgrSiQIziDoH3iB4BiC2UBpAs97AxhuZkPMLA84E5geP4GZlQC3EoTAupYULqk3ZkAXThrfj7+8tIwPN+vylSKZIpGzj9bvH0ioj8Ddq4FLgKeA+cCD7j7PzK4OT2IHQVNQAfBPM3vbzKY3MjtpI75/9Ajc4YanF0Vdioi0kkaDwMx+GHf/tHqP/SKRmbv74+6+r7vv4+7XhuOudPfp4f2j3L23u48Pb1ObnqNErbh7R847ZBAPvbma+R/qGgUimaCpLYIz4+5fUe+xY5NQi6SJS44cTuf8dvzqiQVRlyIiraCpILBG7jc0LFmkS8d2XHLkMJ5fVM5L76+PuhwR2UtNBYE3cr+hYcky5x4yiAHdOvDLJ+ZTW6uPg0g6ayoIxtVdoxgYG96vGx6TovqkjWqfm8MPjhnBvA+28J85n9orWETSSKNB4O45cdcozg3v1w23S2WR0jadOLYfY/p34fqnFrGrqibqckRkDyV6YRqRT4nFjCuO2481FTu56+XlUZcjIntIQSB75ZB9evL5/Xpx88zF2ioQSVMKAtlrFxw6hC27qpm5QAeHi6QjBYHstc8M6U6PTnk8OvfDqEsRkT2gIJC9lpsTY8qYPjy7oIztu6ujLkdEWkhBIK3ihLH92FVVy3NqHhJJOwoCaRUHDu5Or8L2PDr3g6hLEZEWUhBIq8iJGceN6cvMheVs1YVrRNKKgkBazYnj+lJZXcuM+WVRlyIiLaAgkFZTUtyNvl3yeXSO9h4SSScKAmk1sZhx/Ji+vPB+OZt3qHlIJF0oCKRVnTCuH1U1zlPvrY26FBFJkIJAWtW4AV0o7t5BB5eJpBEFgbQqM+P4Mf347+L1bNpeGXU5IpIABYG0uhPG9qWm1nlynpqHRNKBgkBa3ah+nRnSs5MOLhNJEwoCaXVB81BfXlmygfKtu6MuR0SaoSCQpDhhXF9qHZ58V53GIm2dgkCSYkTvQob1KuAR7T0k0uYpCCQpzIwTxvbljeUb+aBiZ9TliEgTFASSNKccMIAcM26ZtTjqUkSkCQoCSZri7h0548Bi7n99FSs2bI+6HBFphIJAkurSycPJzTFufGZR1KWISCMUBJJUvTvnc94hg/nPnA9YsHZL1OWISAMUBJJ0Fx2+DwXtc7n+qYVRlyIiDVAQSNJ17ZjHNw/fhxnz1zF7xcaoyxGRehQEkhJf/exgeha057onF+LuUZcjInEUBJISHfNy+Z/PD+O1ZRt54f31UZcjInEUBJIyZ00ayIBuHfjNUwuordVWgUhbkdQgMLNjzWyhmS02s8sbePwwM3vTzKrN7NRk1iLRy8uN8d2j9uXdNVt44l2dolqkrUhaEJhZDnAzMAUYCZxlZiPrTbYSOB/4e7LqkLbl5JL+7Nu7gN8+s5DqmtqoyxERkrtFMAlY7O5L3b0SuB84KX4Cd1/u7nMBfSNkiZyY8b2jR7C0fDv3vbYy6nJEhOQGQX9gVdzw6nCcZLmjR/bmc8N78qsnFrC0fFvU5YhkvbToLDazaWZWamal5eXlUZcje8nM+M2p44I+gwfnqIlIJGLJDII1QHHc8IBwXIu5+23uPtHdJxYVFbVKcRKtPl3yufaLo5mzqoKbZy6JuhyRrJbMIHgDGG5mQ8wsDzgTmJ7E5UmaOWFsP04e348/PPc+c1ZVRF2OSNZKWhC4ezVwCfAUMB940N3nmdnVZjYVwMwONLPVwGnArWY2L1n1SNt01Umj6VXYnu8+8DY7K2uiLkckK1m6He4/ceJELy0tjboMaUUvL17Pl+94jXMPHsTVJ42OuhyRjGRms919YkOPpUVnsWS2Q4b15IJDh3D3KyuYtXBd1OWIZB0FgbQJPzhmBMN7FfDDh+ayaXtl1OWIZBUFgbQJ+e1yuPGM8WzaUcm0e0rZqDAQSRkFgbQZo/t34YbTxzNn9WZOvvm/vF+2NeqSRLKCgkDalBPH9eOBaQexs6qGL97yMjMXqM9AJNkUBNLmlAzsxn8u/iwDu3fkgrve4I4Xl+piNiJJpCCQNqlf1w48dNHBHD2yD//72Hx+9K+5VFbrVBQiyaAgkDarY14ut5x9AJd+fhgPlq7m3L++xo7K6qjLEsk4CgJp02Ix47KjR3DjGeN4fdlGLrizVEcgi7QyBYGkhS+WDOCG08fz6rINfP3uUnZVKQxEWouCQNLGySX9uf7Ucfx3yXqm3TNbYSDSShQEklZOmTCAX58ylhcWlXPRvbPZXa0wENlbCgJJO6dPLOaXXxrDzIXlfOveN7U3kcheUhBIWjpr0kD+9+TRPLtgHd+67011IIvsBQWBpK1zDhrE1SeN4tkFZXzpTy+zcsOOqEsSSUsKAklr5x48mL+efyAfVOzkhD++qFNSiOwBBYGkvSNH9OKRSw5lQLeOfO2uN/jdjEXU1uqUFCKJUhBIRhjYoyP/uugQvji+P7+b8T4X3l3K5h1VUZclkhYUBJIxOuTl8NvTx3H1SaN4YVE5U29+iVeWbIi6LJE2T0EgGcXMOPfgwTzwjYOornHOuv1VLv77m3xQsTPq0kTaLAWBZKQJg7oz47LD+c5Rw5nxXhmTf/s8Nz33vo5GFmmAgkAyVoe8HL5z1L7MuOxwjhhRxPVPL+LoG1/gmffKdH0DkTgKAsl4xd078qdzJnDvBZ8hLzfG1+8u5ZQ/vcyT766lRnsXiWDp9sto4sSJXlpaGnUZkqaqamq5//WV3PbiUlZt3MmQnp244NAhnDphAPntcqIuT6bf588AAAj2SURBVCRpzGy2u09s8DEFgWSj6ppanppXxm0vLGHO6s1075THVw4axJc/M5DenfOjLk+k1SkIRBrh7ry+bCO3v7iUGfODo5JH9u3MESOKOGJELw4Y2JXcHLWgSvpTEIgkYEn5Np6at5ZZC8uZvWITNbVOYX4unxvek88NL2LCoG4MKyogFrOoSxVpMQWBSAtt3lnFfxevZ9bCdTy/qJyyLbsBKMzPZXxxV0oGduOAgV0pKe5Gl47tIq5WpHkKApG94O4sW7+dN1dW8ObKTby5YhOLyrZSt8NRvy757NunkBG9CxnRp5B9excyrFeBOp+lTWkqCHJTXYxIujEzhhYVMLSogFMnDABg2+5q5qyqYM7qChat3crCsm28vHgDlTXBRXJyYsaEQd04av9efH6/3uxT1AkzNSlJ26QtApFWUl1Ty/INO1hUtpV31mxm5oJ1LFi7FYDBPToyef/eTN6/F8N6FdA5vx3tc2MKB0kZNQ2JRGRNxU6em1/GjPnreGXJx1sMAHk5MQrzcynMz6Vzh3Z065hH787t6d05n16d8+nTOf+j4R6d8rT3kuwVBYFIG7B9dzWvLNnAh1t2sWVnFVt3VbN1VxVbwr8bt1dStmUX5Vt3U/+A55hBz4L29OmST6/CICB6FLSnXcyIxQwziJlhBH8dxx0cwr/BDPNyYhS0z6VT+1w6tc+hU15wP79djJgZMTNywnnGDHLMyM2JkRMz2uUEj7WLxbTnVBpSH4FIG9CpfS5Hjezd7HQ1tc76bbsp27KLsi27WbtlF+Xh/bKtu1hTsZO3Vm5iw/bKFFTdMDNoFwsCIjfHyI0FgZEbC8KkMbEYGEHIxCwIMAsDTJp36eThnDiuX6vPV0Eg0sbkxIzenfObPcK5ttapdac2/MXvDrXu1NT6R1+uZsEXb9138+7qWrbvrmZHZTXbdtewY3c123ZXs7u69qPn1now75pwuKbWqaqppabWqa51qmuc6tra8H5t3LhguLE2BvdgD6xaD7ZPasN6061VIkpdOiRnV+WkBoGZHQv8HsgB7nD3X9V7vD1wNzAB2ACc4e7Lk1mTSKaIxYxYC39L57fLSdqXiaSvpPU+mVkOcDMwBRgJnGVmI+tNdgGwyd2HATcCv05WPSIi0rBk7oYwCVjs7kvdvRK4Hzip3jQnAXeF9x8CJpv2pxMRSalkBkF/YFXc8OpwXIPTuHs1sBnoUX9GZjbNzErNrLS8vDxJ5YqIZKe02DHZ3W9z94nuPrGoqCjqckREMkoyg2ANUBw3PCAc1+A0ZpYLdCHoNBYRkRRJZhC8AQw3syFmlgecCUyvN8104Lzw/qnAc659yUREUippu4+6e7WZXQI8RbD76F/dfZ6ZXQ2Uuvt04C/APWa2GNhIEBYiIpJCST2OwN0fBx6vN+7KuPu7gNOSWYOIiDQt7c41ZGblwIo9fHpPYH0rlpMOtM7ZQeucHfZmnQe5e4N726RdEOwNMytt7KRLmUrrnB20ztkhWeucFruPiohI8igIRESyXLYFwW1RFxABrXN20Dpnh6Ssc1b1EYiIyKdl2xaBiIjUoyAQEclyGRkEZnasmS00s8VmdnkDj7c3swfCx18zs8Gpr7J1JbDOh5nZm2ZWbWanRlFja0tgnS8zs/fMbK6ZPWtmg6KoszUlsM7fNLN3zOxtM3upgWuApJ3m1jluulPMzM0srXcpTeA9Pt/MysP3+G0zu3CvF+rhpeIy5UZwOoslwFAgD5gDjKw3zbeAP4f3zwQeiLruFKzzYGAswRXhTo265hSt85FAx/D+RVnyPneOuz8VeDLqupO9zuF0hcALwKvAxKjrTvJ7fD5wU2suNxO3CLLxgjjNrrO7L3f3uUBtFAUmQSLrPNPdd4SDrxKcATedJbLOW+IGO0GjlxBOF4n8PwNcQ3CFw12pLC4JEl3fVpWJQdBqF8RJI4msc6Zp6TpfADyR1IqSL6F1NrOLzWwJcB1waYpqS5Zm19nMDgCK3f2xVBaWJIl+rk8JmzwfMrPiBh5vkUwMApFPMLNzgInAb6KuJRXc/WZ33wf4EfDTqOtJJjOLATcA34u6lhR6BBjs7mOBZ/i4dWOPZWIQZOMFcRJZ50yT0Dqb2VHAT4Cp7r47RbUlS0vf5/uBk5NaUfI1t86FwGhglpktBw4Cpqdxh3Gz77G7b4j7LN8BTNjbhWZiEGTjBXESWedM0+w6m1kJcCtBCKyLoMbWlsg6D48bPB54P4X1JUOT6+zum929p7sPdvfBBH1BU929NJpy91oi73HfuMGpwPy9XmrUveRJ6nk/DlhE0Pv+k3Dc1QQfEIB84J/AYuB1YGjUNadgnQ8kaG/cTrD1My/qmlOwzjOAMuDt8DY96ppTsM6/B+aF6zsTGBV1zcle53rTziKN9xpK8D3+Zfgezwnf4/32dpk6xYSISJbLxKYhERFpAQWBiEiWUxCIiGQ5BYGISJZTEIiIZDkFgUgrMbOpdWeLNLOfm9n3o65JJBG5URcgkincfTqZfyCfZCBtEYiEzOwcM3s9PMf7rWaWY2bbzOxGM5sXXtOgKJz20rhrHdwfjjvfzG5qYL7jzezVcNp/m1m3cPwsM/t1uMxFZva51K6xSEBBIAKY2f7AGcBn3X08UAOcTXAq51J3HwU8D/wsfMrlQIkHJ/76ZjOzvxv4UTjtO3HzAMh190nAd+qNF0kZNQ2JBCYTnLzrjfDSFB2AdQTXb3ggnOZe4P/C+3OB+8zsYeDhxmZqZl2Aru7+fDjqLoLTm9Spm99sgosHiaSctghEAgbc5e7jw9sId/95A9PVnZPleOBm4ACC8NjTH1V1Z5GsQT/MJCIKApHAs8CpZtYLwMy6h9c4jhGcoRbgy8BL4Tnwi919JsE5/7sABQ3N1N03A5vi2v+/QtDEJNJm6BeICODu75nZT4Gnwy/6KuBigrO1TgofW0fQj5AD3Bs2+xjwB3evaOJqp+cBfzazjsBS4KvJXRuRltHZR0WaYGbb3L3BX/simUJNQyIiWU5bBCIiWU5bBCIiWU5BICKS5RQEIiJZTkEgIpLlFAQiIlnu/wMy1HXmAb7EQgAAAABJRU5ErkJggg==" }, "metadata": { "needs_background": "light" } } ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 295 }, "id": "nLXDcfMjatfV", "outputId": "0cb57303-d80a-4d34-b35c-4d39adb7864d" } } ] }